package com.qqtech.qquan.order.service;

import java.util.List;

import com.qqtech.core.common.exception.OrderException;
import com.qqtech.core.frame.model.Result;
import com.qqtech.core.frame.service.BaseService;
import com.qqtech.qquan.order.enums.OrderBaseDeliveryStatusSignTypeDictEnum;
import com.qqtech.qquan.order.enums.OrderBaseOrderStatusCancelTypeDictEnum;
import com.qqtech.qquan.order.enums.OrderBaseReturnStatusCompleteTypeDictEnum;
import com.qqtech.qquan.order.enums.ReturnPayStatusAgreeTypeEnum;
import com.qqtech.qquan.order.model.OrderBase;
import com.qqtech.qquan.order.model.OrderBaseVo;
import com.qqtech.qquan.order.model.OrderDelivery;
import com.qqtech.qquan.order.model.OrderItem;
import com.qqtech.qquan.order.model.OrderPayLog;

/**
 * 买家、卖家订单处理接口
 * 
 * @author andy.wangzhh
 */
public interface OrderHandleService extends BaseService<OrderBase> {

	/**
	 * 买家下单
	 * 
	 * @param orderBase
	 *            基础订单数据
	 * @param orderDelivery
	 *            订单的物流信息
	 * @param listItem
	 *            订单产品(服务)数据列表
	 * @return 创建成功后返回订单号map.get("orderNo");
	 * @throws OrderException
	 */
	public Result createOrder(OrderBase orderBase, OrderDelivery orderDelivery, List<OrderItem> listItem)
			throws OrderException;

	/**
	 * 买家付款，付部分或全部款项
	 * 
	 * @param orderPayLog
	 *            付款详情
	 * @return 付款后返回付款是否成功，订单是否支付成功-全款(map.get("payAll"))
	 */
	public Result payOrder(OrderPayLog orderPayLog);

	/**
	 * 买家取消订单
	 * 
	 * @param orderNo
	 */
	Result buyerCancel(String orderNo);

	/**
	 * 卖家取消订单
	 * 
	 * @param orderNo
	 */
	Result sellerCancel(String orderNo);

	/**
	 * 卖家发货
	 * 
	 * @param orderNo
	 *            订单号
	 * @param hasNeedDelivery
	 *            是否需要物流：1需要，2不需要
	 * @param sendDeliveryType
	 *            1-商家配送;2-圈圈配送(当hasNeedDelivery=2时需要此参数)
	 * @param deliveryName
	 *            快递或物流公司名称(家政订单可以为空)
	 * @param deliveryNo
	 *            快递或物流单号(家政订单可以为空)
	 * @return
	 */
	Result sended(String orderNo, Integer hasNeedDelivery, Integer sendDeliveryType, String deliveryName,
			String deliveryNo);

	/**
	 * 买家收到货，点击签收
	 * 
	 * @param orderNo
	 *            订单号
	 */
	public Result signed(String orderNo);

	/**
	 * 买家申请退货(签收前)。签收后，平台不提供退货服务，用户可以线下找卖家进行退货
	 * 
	 * @param orderDelivery
	 *            退货物流详细信息
	 */
	public Result applyReturn(OrderDelivery orderDelivery);

	/**
	 * 卖家同意退货(同时退款)
	 * 
	 * @param orderNo
	 *            订单号
	 */
	public Result returned(String orderNo);

	/**
	 * 在线支付订单,下单后X分钟未付款,自动取消
	 * 
	 */
	public void autoCancelBeforePay();

	/**
	 * 在线支付订单,付款X天未确认收货,自动确认收货
	 */
	public void autoSign();

	/**
	 * 在线支付订单,买家申请退款X天后卖家未同意退款,自动退款
	 */
	public void autoReturned();

	/**
	 * 配送人员点击取件 更新订单状态为配送中
	 * 
	 * @param orderBaseVo
	 * @return
	 */
	public Result pickuped(OrderBaseVo orderBaseVo);

	/**
	 * 配送人员点击已配送 更新订单状态为已配送
	 * 
	 * @param orderBaseVo
	 * @return
	 */
	public Result deliveryed(OrderBaseVo orderBaseVo);

	/**
	 * 在线支付订单，买家自提自动签收
	 */
	public Result buyerPickUpAutoSign(String orderNo);

	/**
	 * 在线支付订单，后台管理员取消
	 */
	public Result adminCancel(String orderNo);

	/**
	 * 逾期取消订单的公共业务
	 * 
	 * @param orderNo
	 * @param orderBaseOrderStatusCancelTypeDictEnum
	 * @return
	 */
	Result cancelBizz(String orderNo, OrderBaseOrderStatusCancelTypeDictEnum orderBaseOrderStatusCancelTypeDictEnum);

	/**
	 * 签收公共业务
	 * 
	 * @param orderNo
	 * @param orderBaseDeliveryStatusSignTypeDictEnum
	 * @return
	 */
	Result signedBizz(String orderNo, OrderBaseDeliveryStatusSignTypeDictEnum orderBaseDeliveryStatusSignTypeDictEnum);

	/**
	 * 退款退货公共业务
	 * 
	 * @param orderNo
	 * @param orderBaseReturnStatusCompleteTypeDictEnum
	 * @return
	 */
	Result returnedBizz(String orderNo,
			OrderBaseReturnStatusCompleteTypeDictEnum orderBaseReturnStatusCompleteTypeDictEnum);

	/**
	 * 买家申请退款
	 * 
	 * @param orderNo
	 *            订单号
	 * @return
	 */
	Result applyReturnPay(String orderNo);

	/**
	 * 公共的退款业务逻辑
	 * 
	 * @param orderNo
	 *            订单号
	 * @param returnPayStatusAgreeTypeEnum
	 *            退款方式(1-卖家同意、2-圈圈后台同意)
	 * @return
	 */
	Result agreeReturnPayBizz(String orderNo, ReturnPayStatusAgreeTypeEnum returnPayStatusAgreeTypeEnum);

	/**
	 * 卖家同意退款
	 * 
	 * @param orderNo
	 * @return
	 */
	Result sellerAgreeReturnPay(String orderNo);

	/**
	 * 圈圈后台同意退款
	 * 
	 * @param orderNo
	 * @return
	 */
	Result adminAgreeReturnPay(String orderNo);

	/**
	 * 卖家拒绝退款
	 * 
	 * @param orderNo
	 * @return
	 */
	Result sellerRefuseReturnPay(String orderNo);
}